iT邦幫忙

2024 iThome 鐵人賽

DAY 21
1
生成式 AI

懶人救星:生成式AI 系列 第 21

Day21-揭秘 LlamaIndex:用圖解帶你搞懂複雜查詢與對話引擎!

  • 分享至 

  • xImage
  •  

前言✨

在 LlamaIndex🦙 框架中,提供了豐富的 QueryChat Engine 功能,使得我們能更靈活地處理資料的檢索和互動。透過這些引擎使用者可以更精確地從資料庫中提取所需的資訊,並利用大語言模型(LLM)生成精確的回答。接下來,我們將深入探討各種 Query Engines 和 Chat Engines 的功能和參數設置,並解析不同模式下的應用範例,幫助你更好地掌握這些工具的應用。
https://ithelp.ithome.com.tw/upload/images/20240919/2016811759TTpC4b1u.png

(圖片來源:作者自製)

【Querying🔍】

各 Engine 中使用的 LLM、Embedding、Chunk_Size等設定,可以參考此官方文件,因為較為簡單就不多做介紹了。

【Query Engines🔍】

提供一個數據問答的(QA)接口,透過 retrievers 回傳相關文檔後利用 LLM 回答用戶查詢。LlamaIndex 集成了各項功能,如果想了解背後 LLM 運作流程可以在 Code 加上以下程式,會自動印出執行的 Prompt 內容,透果此指令能更好理解以下講解的內容。

import llama_index.core
llama_index.core.set_global_handler("simple")

常用參數:

index.as_query_engine(
    similarity_top_k=2,
    response_mode="compect", 
)
  • similarity_top_k:每次檢索最相關的 k 個 Node。

  • streaming:決定 LLM 回答方式。

  • response_mode:檢索 + LLM 回覆的執行流程。以下將詳細介紹各模式的差異:

    • compact:此為預設模式,一次打包多個 Nodes 傳送至 LLM (在符合 Token Limit 限制下),如超過 Token Limit 則執行多輪問答直至完成回覆。
      https://ithelp.ithome.com.tw/upload/images/20240921/20168117JtfD3TY4mI.png
    (圖片來源:作者自製)
    • refine:一次發送一個 Nodes 至 LLM (如一個 Node 超過 Token Limit 會切割後分開發送),反覆此操作直至所有 Nodes 都被使用到。
      https://ithelp.ithome.com.tw/upload/images/20240921/20168117AuWFdVyBPb.png
    (圖片來源:作者自製)
    • no_text:只回傳 Nodes 不使用 LLM 回覆查詢,當成 Retrieval 使用。
      https://ithelp.ithome.com.tw/upload/images/20240921/201681171A37gUh8lb.png
    (圖片來源:作者自製)
    • simple_summarize:將所有文字段落截斷以適合單一 LLM Prompt。(適合快速摘要,但可能因截斷而遺失細節。),透果以下 Prompt 中 Relevant Content 範例可以看出差異。
    # Compact:
    city: 台中
    
    台中位於台灣中部,氣候溫暖,擁有台灣第三大城市的規模。它以文化氣息濃厚著稱,擁有豐富的藝術與文化活動,如國立台灣美術館、霧峰林家花園等。台中還是熱門的觀光景點之一,尤其以彩虹眷村和高美濕地最為著名。此外,台中市還以舒適的生活環境和悠閒的生活步調著稱,常被視為居住和發展的理想城市。台中的夜市文化也相當發達,逢甲夜市是其中最具代表性的夜市之一,吸引了無數美食愛好者前來品嚐台灣各地的美食
    
    city: 台北
    
    台北是台灣的首都,也是台灣政治、經濟、文化和交通的中心。這座城市充滿了活力與多元文化,結合了現代與傳統的魅力。台北擁有世界知名的地標——台北101,它曾是全球最高的摩天大樓,並且是購物和觀光的熱門地點。此外,台北還有許多文化和歷史景點,如故宮博物院、龍山寺和中正紀念堂,吸引了大量國內外遊客。台北市內交通便捷,捷運系統發達,是探索這座都市的絕佳方式。這裡也是台灣美食的集中地,夜市文化如士林夜市、饒河街夜市更是不可錯過的體驗之一。
    
    
    
    # simple_summarize:
    ['city: 台中\n\n台中位於台灣中部,氣候溫暖,擁有台灣第三大城市的規模。它以文化氣息濃厚著稱,擁有豐富的藝術與文化活動,如國立台灣美術館、霧峰林家花園等。台中還是熱門的觀光景點之一,尤其以彩虹眷村和高美濕地最為著名。此外,台中市還以舒適的生活環境和悠閒的生活步調著稱,常被視為居住和發展的理想城市。台中的夜市文化也相當發達,逢甲夜市是其中最具代表性的夜市之一,吸引了無數美食愛好者前來品嚐台灣各地的美食\ncity: 台北\n\n台北是台灣的首都,也是台灣政治、經濟、文化和交通的中心。這座城市充滿了活力與多元文化,結合了現代與傳統的魅力。台北擁有世界知名的地標——台北101,它曾是全球最高的摩天大樓,並且是購物和觀光的熱門地點。此外,台北還有許多文化和歷史景點,如故宮博物院、龍山寺和中正紀念堂,吸引了大量國內外遊客。台北市內交通便捷,捷運系統發達,是探索這座都市的絕佳方式。這裡也是台灣美食的集中地,夜市文化如士林夜市、饒河街夜市更是不可錯過的體驗之一。']
    
    • accumulate:針對每個 Node 生成出一個答案,並將回應累積到一個陣列中。最終會返回所有回應的字串集合。(適合在需要對每個段落分別執行相同查詢的情況下使用。)

    • compact_accumulate:compact + accumulate 的綜合體,會「壓縮」每個 LLM 提示,然後對每個段落分別執行相同查詢。

  • text_qa_template、refine_template:更改 Prompt 內容。

  • node_postprocessors:用於過濾 Nodes 內容,如相似度閾值。

結合之前介紹的功能,只需要增加幾行程式碼即可實現複雜流程:

# Import Module

# Create documents
...

# Set Parameter
...

# Embedding
index = VectorStoreIndex.from_documents(documents)

# Create Query Engine
query_engine = index.as_query_engine(
    response_mode="compect", 
    similarity_top_k=2
)
response = query_engine.query("Your Query")

# Stream Response
query_engine = index.as_query_engine(streaming=True)
streaming_response = query_engine.query("Your Query")
streaming_response.print_response_stream()

【Chat Engines💬】

LlamaIndex 提供一個數據對話的(Chat)接口,透過 retrievers 回傳相關文檔後利用 LLM 搭配歷史紀錄回答用戶查詢。LlamaIndex 集成了各項功能,如果想了解背後 LLM 運作流程可以在 Code 加上以下程式,會自動印出執行的 Prompt 內容,透果此指令能更好理解以下講解的內容。

import llama_index.core
llama_index.core.set_global_handler("simple")

常用參數:

  • best:將查詢引擎變成一個工具,可以與資料代理(Data Agent)配合使用,具體取決於 LLM 的支援情況。資料代理通常使用 OpenAI 的函數呼叫 API,如 GPT-3.5-turbo 或 GPT-4,並利用 ReAct 或 OpenAI 模式來執行。

    • react:與 best 模式相同,使用了 Data Agent 並透過 ReAct 方法實現。簡單來說就是當用戶輸入查詢時,LLM 會先透過歷史資料判斷是否需要執行 Agent,如果歷史資料內容具有查詢的答案,則會直接回覆解答。

    • openai:與 best 模式相同,使用 Data Agent 並依賴 OpenAI Agent 方法。

  • condense_question:透過歷史聊天紀錄+使用者查詢產生一個新的查詢語句。結合相關 Nodes 和 新查詢語句透過 LLM 生成回覆。
    https://ithelp.ithome.com.tw/upload/images/20240921/20168117hWFnGugF9u.png

(圖片來源:作者自製)
  • context:將歷史聊天紀錄使用者查詢相關 Nodes 發送至 LLM 生成回覆。
    https://ithelp.ithome.com.tw/upload/images/20240921/20168117ig3TIzVPcI.png
(圖片來源:作者自製)
  • condense_plus_context:結合了 condense_question 和 context 模式。首先透過歷史聊天紀錄+使用者查詢產生一個新的查詢語句,再將**歷史聊天紀錄+新的使用者查詢+相關 Nodes **發送至 LLM 生成回覆。。
    https://ithelp.ithome.com.tw/upload/images/20240921/20168117rUc5JnK4Qh.png
(圖片來源:作者自製)
  • simple:直接與 LLM 進行簡單聊天,不涉及任何查詢引擎(跟直接使用 LLM 一模一樣。)

Routing🔀】

Routing 是一種透過 LLM 針對查詢進行選擇判斷的模組,解決了當我們同時有多個資料源時,系統無法決定要使用哪個引擎的問題。(簡單來說就是利用 Prompt 結合 description 和 Query 兩項資訊,並透過 LLM 進行判斷該使用的結果)

筆者的經驗中,如果資料來源很相似,會遇到難以用文字區分各個引擎的內容,最終還是建議自定 Routing 會比 LLM 可靠性高更。

from llama_index.core.query_engine import RouterQueryEngine
from llama_index.core.selectors import PydanticSingleSelector
from llama_index.core.tools import QueryEngineTool


list_tool = QueryEngineTool.from_defaults(
    query_engine=list_query_engine,
    description="Useful for summarization questions related to the data source",
)
vector_tool = QueryEngineTool.from_defaults(
    query_engine=vector_query_engine,
    description="Useful for retrieving specific context related to the data source",
)

query_engine = RouterQueryEngine(
    selector=PydanticSingleSelector.from_defaults(),
    query_engine_tools=[
        list_tool,
        vector_tool,
    ],
)
query_engine.query("<query>")

結論🎯

LlamaIndex 的 Query 和 Chat Engine 為資料檢索和對話提供了強大且多樣化的支持。在 Query Engine 中,從簡單的檢索 Node 到複雜的多輪查詢流程,使用者可以根據需求靈活選擇參數與模式,無論是要處理大規模資料的摘要,還是細緻到每個段落的深度解讀。 Chat Engine 則將歷史紀錄與即時查詢相結合,提供了多層次的回答模式,並可輔以資料代理(Data Agents)和 LLM 互動,使其不僅適合單次回答,更具備多輪對話的記憶與上下文理解能力。

透過這些功能,我們可以更精確地處理各種查詢與對話需求,從而提升應用的智能化程度與回應品質。無論是為了快速回應使用者查詢,還是進行深度對話,LlamaIndex 的靈活架構都能滿足各類場景的應用需求。


上一篇
Day20-RAG大秘密揭露!資料檢索其實可以這麼高效
下一篇
Day22-LlamaIndex 黑科技圖解:讓你在無 SQL 技能下秒變查詢達人!
系列文
懶人救星:生成式AI 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言